/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siagefi.mb;

import br.siagefi.enuns.OrigemDocumento;
import br.siagefi.enuns.Periodicidade;
import br.siagefi.enuns.TipoCusto;
import br.siagefi.model.Documento;
import br.siagefi.model.Lancamento;
import br.siagefi.model.Pessoa;
import br.siagefi.service.DocumentoService;
import br.siagefi.util.FacesUtil;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

/**
 *
 * @author Note
 */
@SessionScoped
@ManagedBean(name = "documentoBean")
public class DocumentoBean implements Serializable {

   private Documento documento;
    private Lancamento lancamento;
    private final DocumentoService service;
    private List<Documento> documentos;
    
    private boolean exibeMsgListaVazia;
    private boolean habilitaTipoCusto;
    private boolean habilitarDadosParcela;
    
    
    public DocumentoBean() {
        this.documento = new Documento();
        this.lancamento = new Lancamento();
        this.service = new DocumentoService();
        this.listar();
        this.exibeMsgListaVazia = false;
        this.habilitaTipoCusto = true;
        this.habilitarDadosParcela = false;
       
    }
    
    // regras de negócio
    
    public String inserirLancamento(){
        service.incluirLancamento(this.getDocumento());
        setExibeMsgListaVazia(false);
        return "incluirDocumento";
    }
    
    public String alterarLancamento(){
        int indice = this.getDocumento().getLancamentos().indexOf(this.getLancamento());
        this.getDocumento().getLancamentos().set(indice, lancamento);
        return "incluirDocumento";
    }
    
    // navegação
    
    //template
    public String gerenciarDocumento(){
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("documentoBean");
        return "/pages/users/operador/documento";
    }
    
    public String alterar(Documento documento){
        this.setDocumento(documento);
        if (documento.getLancamentos().isEmpty())
            this.setExibeMsgListaVazia(true);
        return "incluirDocumento";
    }
    
    public String consultar(Documento documento){
        this.setDocumento(documento);
        return "consultarDocumento";
    }
    
    public String editarLancamento(Lancamento lancamento){
        this.setLancamento(lancamento);
        return "alterarLancamento";
    }
    
    // persistência
    
    public String gravar(){
       if(this.getDocumento().getId() == null){
           //incluir
           if(service.jaExiste(this.getDocumento())){
              FacesUtil.addErrorMessage("Documento já cadastrado.");
           }else {
              if(this.getDocumento().getLancamentos().isEmpty()){
                  this.inserirLancamento();
              }
              if(!service.validaValorLancamentos(this.documento)){
                  FacesUtil.addErrorMessage("A soma dos lançamentos é diferente do valor do documento.");
                  return "incluirDocumento";
              } 
              service.atualizaSituacaoDocumento(documento);
              service.gravarDocumento(this.getDocumento());
              FacesUtil.addSuccessMessage("Documento incluido com sucesso!");
              service.atualizaSaldo(this.getDocumento());
           }
        }else{ 
           //alterar
           if(!service.validaValorLancamentos(this.documento)){
                  FacesUtil.addErrorMessage("A soma dos lançamentos é diferente do valor do documento.");
                  return "incluirDocumento";
              } 
           service.atualizaSituacaoDocumento(documento);
           service.alterar(documento);
           FacesUtil.addSuccessMessage("Documento alterado com sucesso!");
           service.atualizaSaldo(this.getDocumento());
       }
       this.limpar();
       this.listar();
       return "documento";
    }
    
    public void remover(Documento documento){
        if(documento.getTipoDocumento() == null){
            FacesUtil.addErrorMessage("Documento vinculado a Nota Fiscal. Exclusão não permitida.");
        }else {
            if(service.existeLancamentoVinculado(documento)){
                service.reverterLancamentos(documento);
            }
            service.remover(documento);
            this.limpar();
            FacesUtil.addSuccessMessage("Documento excluido com sucesso!");
            this.listar();
        }
    }
    
    
    public final void listar(){
         this.documentos = service.listar();
    }
    
    // validadores

    // métodos de apoio
    
    public String voltar(){
        this.limpar();
        return "documento";
    }
    
    public void limpar(){
        this.setDocumento(new Documento());
        this.setLancamento(new Lancamento());
        this.setExibeMsgListaVazia(false);
        this.setHabilitaTipoCusto(true);
        this.setHabilitarDadosParcela(false);
    }
    
    public void buscaNomesPorOrigem(AjaxBehaviorEvent event){
        String novaOrigem = event.getComponent().getAttributes().get("value").toString();
        this.getDocumento().setOrigem(novaOrigem);
    }
    
    public void ativarTipoCusto(AjaxBehaviorEvent event){
        String tipoCusto = event.getComponent().getAttributes().get("value").toString();
        System.out.println(tipoCusto);
        if(tipoCusto.equals("DEBITO")){
            this.setHabilitaTipoCusto(false);
        }else {
            this.setHabilitaTipoCusto(true);
        }
    }
    
     public void ativarDadosParcela(AjaxBehaviorEvent event){
        String formaPgto = event.getComponent().getAttributes().get("value").toString();
        System.out.println(formaPgto);
        if(formaPgto.equals("PARCELADO")){
            this.setHabilitarDadosParcela(false);
        }else {
            this.setHabilitarDadosParcela(true);
        }
    }
    
    // listas e outros dados
    
     public List<Pessoa> getNomesOrigem() {
        return this.service.listarNomesOrigem(this.getDocumento().getOrigem());
    }
    
    public List<OrigemDocumento> getListaOrigens() {
        return Arrays.asList(OrigemDocumento.values());
    }

    public List<TipoCusto> getListaTipoCusto() {
        return Arrays.asList(TipoCusto.values());
    }

    public List<Periodicidade> getListaPeriodicidade() {
        return Arrays.asList(Periodicidade.values());
    }
    
    public Date getDataAtual(){
        return new GregorianCalendar().getInstance().getTime();
    }

    // getters e setters

    public Documento getDocumento() {
        return documento;
    }

    public void setDocumento(Documento documento) {
        this.documento = documento;
    }

    public Lancamento getLancamento() {
        return lancamento;
    }

    public void setLancamento(Lancamento lancamento) {
        this.lancamento = lancamento;
    }

    public List<Documento> getDocumentos() {
        return documentos;
    }

    public void setDocumentos(List<Documento> documentos) {
        this.documentos = documentos;
    }
    
    public boolean isExibeMsgListaVazia() {
        return exibeMsgListaVazia;
    }

    public void setExibeMsgListaVazia(boolean exibeMsgListaVazia) {
        this.exibeMsgListaVazia = exibeMsgListaVazia;
    }

    public boolean isHabilitaTipoCusto() {
        return habilitaTipoCusto;
    }

    public void setHabilitaTipoCusto(boolean habilitaTipoCusto) {
        this.habilitaTipoCusto = habilitaTipoCusto;
    }

    public boolean isHabilitarDadosParcela() {
        return habilitarDadosParcela;
    }

    public void setHabilitarDadosParcela(boolean habilitarDadosParcela) {
        this.habilitarDadosParcela = habilitarDadosParcela;
    }

    

}
